package cn.edu.tsinghua.training.cms.demo.util;

/*
	在Struts2中，一般的内置类型都会在由系统自动进行转换.但是Date类型好像有时候行，有时候不行
	造成这种问题的原因是由于不同的浏览器选择的优先显示页面的语言不同造成的
	一般来说，(zh_CN)中文优先的话,struts默认只支持2000-1-1这种格式的转换,(en_US)英文优先,struts默认只支持1/1/2000这种格式的转换
	因此要想保证系统一定要正确的对Date类型进行转换，就要写一个全局的类型转换类，进行Date与String之间的类型转换
	在src根目录下创建xwork-conversion.properties文件，并在里面添加下面语句，注册类型转换器
	java.util.Date=some_package.DateConverter
*/

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class DateConverter extends DefaultTypeConverter {
//	支持转换的日期格式
	private static final DateFormat[] ACCEPT_DATE_FORMATS = { 
		new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), 
		new SimpleDateFormat("yyyy-MM-dd"), 
		new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"), 
		new SimpleDateFormat("yyyy/MM/dd"),
		new SimpleDateFormat("yyyy/MM") 
	};

	@SuppressWarnings("rawtypes")
	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		if (toType == Date.class) {// 浏览器向服务器提交时，进行String to Date的转换
			String dateString = null;
			String[] params = (String[]) value;
			dateString = params[0];// 获取日期的字符串
			for (DateFormat format : ACCEPT_DATE_FORMATS) {
				try {
					return format.parse(dateString);// 遍历日期支持格式，进行转换
				} catch (Exception e) {
					continue;
				}
			}
			return null;
		} else if (toType == String.class) {// 服务器向浏览器输出时，进行Date to String的类型转换
			Date date = (Date) value;
			return ACCEPT_DATE_FORMATS[0].format(date);// 默认输出格式 yyyy-MM-dd HH:mm:ss
		}
		return null;
	}
	
}
